<?php
class GraduaUser extends sfBasicSecurityUser {

  const VISITOR_USERNAME = 'visitor';
  
  /**
   * Cria um nome único de sessão que deve persistir durante toda a sessão. 
   * Também autentica o usuário inicialmente como um visitor.
   * O nome de sessão será o mesmo mesmo que o usuário faça diferentes logins e logouts.
   */
  function initSession() {
    $sessionName = $this->createSessionName();
    $this->setAttribute('session',$sessionName);
    $this->initVisitor();
    return $sessionName;
  }
  
  /**
   * Indica se tem um código de sessão gravado na sessão.
   *
   * @return boolean
   */
  function hasSession() {
    return $this->hasAttribute('session');
  }
  
  /**
   * Autentica o usuário como um usuário visitor. 
   * Todo usuário do sistema é autenticado assim logo que inicia a sessão.
   */
  function initVisitor() {
    $user = UserTable::readUserRoleAndCredentialsByUsername(self::VISITOR_USERNAME);
    if(!$user) {
      throw new Exception('Visitor role was not found on the database.');
    }
    $this->setUser($user);
    $this->setAttribute('isVisitor',true);
  }
  
  /**
   * Indica se o usuário atual é um visitor.
   * Isto basiciamente significa que ele não está logado. 
   * @return boolean 
   */
  function isVisitor() {
    return $this->getAttribute('isVisitor');
  }
  
  /**
   * Recebe um array que representa uma role. 
   * Adiciona à sessão todas as credenciais desta role. 
   *
   * @param unknown_type $role
   */
  private function setRole($role) {
    $this->clearCredentials();
    $this->setAttribute('role',$role['constant']);
    foreach($role['Credential'] as $credential) {
      $this->addCredential($credential['name']);
    }
  }
  
  /**
   * Registra o usuário informado como o usuário atual logado no sistema.
   *
   * @param array $user
   * @param boolan $visitor indica se ele é ou não um visitor, que significa que ele não se autenticou. 
   */
  public function setUser($user, $visitor = false) {
    $this->setRole($user['Role']);
    $this->setAuthenticated(true);
    $this->setAttribute('isVisitor',$visitor);
    $this->setAttribute('id', $user['id']);
    $this->setAttribute('username',$user['username']);
  }
  
  /**
   * Transforma novamente o usuário em um visitor.
   * Mantem o nome da sessão.
   */
  public function logOut() {
    $this->initVisitor();
  }
  
  /**
   * Cria um nome para uma nova sessão iniciada. 
   * O nome é criado com a data atual com milisegundos mais um rand de 5000. 
   * @return unknown
   */
  function createSessionName() {
    return date('Y-m-d H:i:s').'#'.rand(1,99999);
  }
  
}
?>